package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.enums.UsageStatusEnum;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.IdentifierUtil;
import qc.module.ehs.dto.facility.FacilityDto;
import qc.module.ehs.dto.facility.FacilityQueryConditionDto;
import qc.module.ehs.entity.EhsFacilityBasic;
import qc.module.ehs.entity.EhsUnitInfo;
import qc.module.ehs.mapper.EhsFacilityBasicMapper;
import qc.module.ehs.repository.EhsFacilityBasicRepository;
import qc.module.ehs.repository.EhsUnitInfoRepository;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 设备设施基础信息接口Service
 *
 * @author QuCheng Tech
 * @create 2024/9/23
 */
@Service
public class EhsFacilityBasicService {

    @Autowired
    private EhsFacilityBasicRepository repository;

    @Autowired
    private EhsUnitInfoRepository unitInfoRepository;

    /**
     * 查询设备设施
     *
     * @param condition
     * @return List<FacilityDto>
     * @author QuCheng Tech
     * @since 2024/9/24
     */
    public List<FacilityDto> query(FacilityQueryConditionDto condition) throws QCPromptException {
        //1.查询条件验证
        if (condition == null)
            throw new QCPromptException("查询条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        //2.构建设备设施查询条件
        LambdaQueryWrapper<EhsFacilityBasic> wrapper = new LambdaQueryWrapper<>();
        //匹配单元
        if (StringUtils.isNotBlank(condition.getUnitid())) {
            wrapper.eq(EhsFacilityBasic::getUnitid, condition.getUnitid());
        } else {
            //默认查询所属组织下所有单元的设备设施
            //根据组织代码查询单元，获取单元ID集合
            LambdaQueryWrapper<EhsUnitInfo> unitWrapper = new LambdaQueryWrapper<>();
            unitWrapper.eq(EhsUnitInfo::getOrgcode, condition.getOrgcode());
            unitWrapper.orderByAsc(EhsUnitInfo::getOdr, EhsUnitInfo::getUnitname);
            List<EhsUnitInfo> unitInfos = unitInfoRepository.selectList(unitWrapper);
            if (CollectionUtils.isEmpty(unitInfos))
                return null;
            List<String> unitIds = unitInfos.stream().map(EhsUnitInfo::getUnitid).collect(Collectors.toList());

            wrapper.in(EhsFacilityBasic::getUnitid, unitIds);
        }
        wrapper.eq(EhsFacilityBasic::getStatus, condition.getStatus());
        //关键字，like匹配名称、编号、生产厂家、SN、销售商等
        if (StringUtils.isNotBlank(condition.getKeywords())) {
            wrapper.and(q -> {
                q.like(EhsFacilityBasic::getName, condition.getKeywords())
                        .or().like(EhsFacilityBasic::getCode, condition.getKeywords())
                        .or().like(EhsFacilityBasic::getManufactor, condition.getKeywords())
                        .or().like(EhsFacilityBasic::getSn, condition.getKeywords())
                        .or().like(EhsFacilityBasic::getDealer, condition.getKeywords());
            });
        }

        //3.查询设备设置信息，设置返回结果
        List<EhsFacilityBasic> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            List<FacilityDto> result = EhsFacilityBasicMapper.MAPPER.toDtoList(ens);
            result.forEach(dto -> dto.setOrgcode(condition.getOrgcode()));
            return result;
        }

        return null;
    }

    /**
     * 获取指定
     *
     * @param id 设备设施ID
     * @return FacilityDto
     * @author QuCheng Tech
     * @since 2024/9/23
     */
    public FacilityDto getById(String id) {

        EhsFacilityBasic en = repository.selectById(id);
        if (Objects.nonNull(en)) {
            FacilityDto dto = EhsFacilityBasicMapper.MAPPER.toDto(en);
            //获取指定单元信息，设置返回结果的组织代码
            EhsUnitInfo unitInfo = unitInfoRepository.selectById(dto.getUnitid());
            if (Objects.nonNull(unitInfo)) dto.setOrgcode(unitInfo.getOrgcode());
            return dto;
        }

        return null;
    }

    /**
     * 新增
     *
     * @param dto 新增信息DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/9/23
     */
    public String add(FacilityDto dto) {
        //1.DTO验证
        if (dto == null)
            return QCUnifyReturnValue.Warn("新增对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            return QCUnifyReturnValue.Warn("组织代码不能为空");
        if (StringUtils.isBlank(dto.getUnitid()))
            return QCUnifyReturnValue.Warn("名称不能为空");
        if (StringUtils.isBlank(dto.getUnitid()))
            return QCUnifyReturnValue.Warn("指定所属单元ID不能为空");
        if (StringUtils.isBlank(dto.getCode()))
            return QCUnifyReturnValue.Warn("编号不能为空");
        if (StringUtils.isBlank(dto.getCat1()))
            return QCUnifyReturnValue.Warn("大类不能为空");
        if (StringUtils.isBlank(dto.getCat2()))
            return QCUnifyReturnValue.Warn("分类不能为空");

        //2.DTO转换为entity
        EhsFacilityBasic en = EhsFacilityBasicMapper.MAPPER.dtoToEntity(dto);

        //转换为Entity后判断枚举类型是否为空，是否有效
        if (en.getStatus() == null || en.getStatus() == UsageStatusEnum.UN_DEFINE)
            return QCUnifyReturnValue.Warn("使用状况不能为空");

        en.setId(IdentifierUtil.randomUUID());

        if (repository.insert(en) < 0x1)
            return QCUnifyReturnValue.Warn("保存失败");

        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改
     *
     * @param dto 新增信息DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/9/23
     */
    public String update(FacilityDto dto) {
        //1.DTO验证
        if (dto == null)
            return QCUnifyReturnValue.Warn("修改的对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            return QCUnifyReturnValue.Warn("组织代码不能为空");
        if (StringUtils.isBlank(dto.getId()))
            return QCUnifyReturnValue.Warn("设备设施ID不能为空");
        if (StringUtils.isBlank(dto.getName()))
            return QCUnifyReturnValue.Warn("名称不能为空");
        if (StringUtils.isBlank(dto.getUnitid()))
            return QCUnifyReturnValue.Warn("指定所属单元ID不能为空");
        if (StringUtils.isBlank(dto.getCode()))
            return QCUnifyReturnValue.Warn("编号不能为空");
        if (StringUtils.isBlank(dto.getCat1()))
            return QCUnifyReturnValue.Warn("大类不能为空");
        if (StringUtils.isBlank(dto.getCat2()))
            return QCUnifyReturnValue.Warn("分类不能为空");

        if (!isExist(dto.getId()))
            return QCUnifyReturnValue.Warn("修改的设备设施信息不存在");

        EhsUnitInfo unitInfo = unitInfoRepository.selectById(dto.getUnitid());
        if (Objects.isNull(unitInfo))
            return QCUnifyReturnValue.Warn("指定所属单元信息不存在");

        //2.DTO转换为entity
        EhsFacilityBasic en = EhsFacilityBasicMapper.MAPPER.dtoToEntity(dto);

        //转换为Entity后判断枚举类型是否为空，是否有效
        if (en.getStatus() == null || en.getStatus() == UsageStatusEnum.UN_DEFINE)
            return QCUnifyReturnValue.Warn("使用状况不能为空");

        repository.updateById(en);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除
     *
     * @param id 设备设施ID，可以指定多个，使用“,”分隔
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/9/23
     */
    public String deleteById(String id) {
        if (StringUtils.isBlank(id)) return QCUnifyReturnValue.Warn("设备设施ID不能为空");

        String[] ids = id.split(",");
        for (String facilityId : ids) {
            repository.deleteById(facilityId);
        }

        return QCUnifyReturnValue.Success();
    }

    /**
     * 导入/批量新增
     *
     * @param dtos 导入/新增设备设置
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/9/24
     */
    public String batchAdd(List<FacilityDto> dtos) {
        if (CollectionUtils.isEmpty(dtos)) return QCUnifyReturnValue.Warn("导入/批量新增的设备设施信息不能为空");

        dtos.forEach(dto -> add(dto));

        return QCUnifyReturnValue.Success();
    }

    /**
     * 判断设备设施是否存在
     *
     * @param id 设备设施ID
     * @return true表示存在，false表示不存在
     * @author QuCheng Tech
     * @since 2024/9/23
     */
    private boolean isExist(String id) {
        EhsFacilityBasic en = repository.selectById(id);
        if (Objects.nonNull(en)) return true;
        return false;
    }
}
